/*
 * 输入数据验证(Validation)
 * TextField提供输入是否为空、最大最小长度检查，其他的通过vtype来实现
 * allowBlank:
 * minLength: minLengthText
 * maxLength: maxLengthText
 * vtype: vtypeText
 * 
 * 以下为VTypes,前4个为系统内置的，其余为自己添加的
 * alpha: 检查输入是否为字母
 * alphanum: 检查输入是否为字母或数字
 * email: 检查输入是否为电子邮件
 * url: 检查输入是否为URL
 * time: 检查输入的是否为时间
 * ipaddress: 检查输入的是否是IP地址
 * numbers: 检查正整数
 * timerange_c_gap: 通过gap来判断间隔时间
 * password: 检查第二次输入的密码是否和第一次一致
 */

 /*
  * 每个vtype定义有3个属性：{name}、{name}Text、{name}Mask，其中{name}用实际的vtype名称替代
  * {name}为此vtype的验证函数
  * {name}Text为验证函数返回false时，显示的出错信息
  * {name}Mask为每次敲键时的匹配字符串
  */
Ext.apply(Ext.form.VTypes, {
    ipaddress: function(v) {
        var arr = v.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
        if (arr == null) return false;

        var IPArray = v.split(".");
        var ip1 = parseInt(IPArray[0]);
        var ip2 = parseInt(IPArray[1]);
        var ip3 = parseInt(IPArray[2]);
        var ip4 = parseInt(IPArray[3]);
        if(ip1 == 0 && ip2 == 0 && ip3 == 0 && ip4 == 0) {
            return true;
        }

        for (var i = 0; i < IPArray.length; i++) {
            if (IPArray[i].length > 1 && IPArray[i].indexOf("0") == 0) {
                return false;
            }
        }

        if(ip1 == 0 || ip1 == 127 || ip4 == 0||ip4 == 255) return false;
        if (ip1 < 0 || ip1 > 247 || ip2 < 0 || ip2 > 255 || ip3 < 0 || ip3 > 255 || ip4 < 0 || ip4 > 255) return false;
        /* 检查二进制值是否合法 */
        return true;
    },
    ipaddressText: 'IP地址格式不正确，请检查输入的合法的IP地址！',
    ipaddressMask: /[\d\.]/i,
    
    email_list: function(v) {
        var arr = v.match(/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/);
        if (arr == null) return false;
        return true;
    },
    email_listText: '邮箱格式不正确，请检查输入的合法的邮件列表地址！',
    email_listMask: /[\d\.]/i,

    email_server: function(v) {
        var arr = v.match(/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/);
        if (arr == null) return false;
        return true;
    },
    email_serverText: '邮箱服务器格式不正确，请检查输入的合法的邮箱服务器地址！',
    email_serverMask: /[\d\.]/i,

    numbers: function(v) {
    	if(v == '-1')
    		return true;
        return /^\d+$/.test(v);
    },
    numbersText: '必须是为正整数或-1，请检查输入的合法的数字！',
    numbersMask: /[\d\-]/i,
    
    tel: function(v) {
        return /^\d+$/.test(v)&&v.length==11;
    },
    telText: '手机号码必须为11位数字',
    telMask: /[\d]/i,

    strLength:function(v) {
    	return computeStrLength(v) <= 20;
    },
    strLengthText:'字符长度太长',
    
    time: function(val, field) {
        return /^([1-9]|1[0-9]):([0-5][0-9])(\s[a|p]m)$/i.test(val);
    },
    timeText: '错误的时间格式.  请输入格式为 "12:34 PM"的时间.',
    timeMask: /[\d\s:amp]/i,

    password: function(val, field) {
        if (field.initialPassField) {
            var pwd = Ext.getCmp(field.initialPassField);
            return (val == pwd.getValue());
        }
        return true;
    },
    passwordText: '密码不匹配',
    
    passwordValue: function(val, field) {
				return  /^([a-zA-Z])+([0-9])+([a-zA-Z0-9_])*$/.test(val);
    },
    passwordValueText: '密码格式不正确，密码由字母数字下划线组成，必须由字母开头，包括字母和数字!',

    datetime: function(val, field) {
        return /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/.test(val);
    },
    datetimeText: '必须为日期时间格式（2010-01-01 08:00:00）',

    MACTEXT: function(v) {
        var reg_name = /^[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}$/;
        if (!reg_name.test(v)) return false;
        var macArray = v.split(":");
        if (macArray.length > 6) return false;
        return true;
    },
    MACTEXTText: 'MAC的格式错误，请检查输入的合法的MAC地址！',
    MACTEXTMask: /[a-f\d\:]/i,

	NameText: function(v) {
        var reg_name = /^[A-Za-z\d\_]{1,20}$/;
		var reg_han = /[\u4e00-\u9fa5]/;
        if (v.length > 20 || v.length < 4) return false;
		if(reg_han.test(v)) { return false; } 
        if (reg_name.test(v)) return true;
        return false;
    },
    NameTextText: '格式错误，长度为4-20字符，仅包括字母数字和下划线！',
    NameTextMask: /[a-z\d\_]/i,
  
    orderId: function(v) {
        var reg_name = /^[A-Za-z\d\_]{1,50}$/;
		var reg_han = /[\u4e00-\u9fa5]/;
        if (computeStrLength(v) > 50) return false;
		if(reg_han.test(v)) { return false; } 
        if (reg_name.test(v)) return true;
        return false;
    },
    orderIdText: '格式错误，长度不超过50个字符，仅包括字母数字和下划线！',
    orderIdMask: /[a-z\d\_]/i,
    
    mobile: function(v) {
        return /^\d+$/.test(v) && v.length == 11;
    },
    mobileText: '请输入11位数字的手机号',
    mobileMask: /[\d]/i,
    
    PriceNum: function(v) {
        return /^\d+$/.test(v) && v >= 0 && v < 99999;
    },
    PriceNumText: '请输入（0-99999间的整数）！',
    PriceNumMask: /[\d]/i,
    
    channelId: function(v) {
        if (computeStrLength(v) > 20) return false;
        return true;
    },
    channelIdText: '格式错误，长度不超过20个字符！',
    channelIdMask: /[\d]/i,
    
    propertyId: function(v) {
        if (computeStrLength(v) > 50) return false;
        return true;
    },
    propertyIdText: '格式错误，长度不超过50个字符！',
    
    propertyName: function(v) {
        if (computeStrLength(v) > 200) return false;
        return true;
    },
    propertyNameText: '格式错误，长度不超过200个字符！',
    
    propertyType: function(v) {
        if (computeStrLength(v) > 100) return false;
        return true;
    },
    propertyTypeText: '格式错误，长度不超过100个字符！',
    
    propertyUser: function(v) {
        if (computeStrLength(v) > 40) return false;
        return true;
    },
    propertyUserText: '格式错误，长度不超过40个字符！',
    
    MaxTextLength: function(v) {
        if(v.length > 30){
            return false;
        }
        if(v.indexOf('*') >=0||v.indexOf(' ') >=0||v.indexOf('\\') >=0||v.indexOf('&') >=0||v.indexOf('\'') >=0||v.indexOf('"') >=0){
            return false;
        }
        return true;
    },
    MaxTextLengthText: '不能包含特殊字符* \ & \' \"和空格 不能超过30个字!',
    MaxTextLengthMask: /[^\\\&]/i,
    
    timerange: function(val, field) {
        var time = field.getValue();
        if (!time) return;
        var formPanel = field.ownerCt;
        if(!formPanel.form)
        	formPanel = formPanel.ownerCt;
        var timeField;
        if (field.startTimeField) {
            var startValue = formPanel.getForm().findField(field.startTimeField).getValue();
            timeField = formPanel.getForm().findField(field.startTimeField);
            if(startValue && startValue > time && !(time == '00:00' && startValue == '23:00'))return false;
        }
        else if (field.endTimeField) {
            var endValue = formPanel.getForm().findField(field.endTimeField).getValue();
            timeField = formPanel.getForm().findField(field.endTimeField);
            if(endValue&&endValue< time&& !(time == '23:00' && endValue == '00:00')) return false;
        }
        if(timeField.getValue())
            timeField.clearInvalid();
        return true;
    },
    timerangeText: '时间范围选择错误,起始时间要小于结束时间!',
    
    timerange_c_gap: function(val, field) {
        var time = field.getValue();
        if (!time) return;
        var formPanel = field.ownerCt;
        var gap = field.gap ? field.gap : 90;
        gap = gap + 1;
        var timeField;
        if (field.startTimeField) {
        	timeField = formPanel.query('datefield[name='+field.startTimeField+']')[0];
            var startValue = timeField.getValue();
            if(time > new Date()) return false;
            if(startValue && startValue > time && !(time == '00:00' && startValue == '23:00')) return false;
            if((time - startValue) > 86400000*gap) return false;
        }else if (field.endTimeField) {
        	timeField = formPanel.query('datefield[name='+field.endTimeField+']')[0];
            var endValue = timeField.getValue();
        	if(time > new Date()) return false;
            if(endValue&&endValue< time && !(time == '23:00' && endValue == '00:00')) return false;
            if((endValue - time) > 86400000*gap) return false;
        }else return false;
        if(timeField.getValue())
            timeField.clearInvalid();
        return true;
    },
    timerange_c_gapText: '起始时间要小于或等于结束时间且保证在允许时间间隔内，亦不可超当前时间!',
    timerange_c_gapMask: /[^\\\&]/i,
    
	domain: function(v) {
        return /^((http\:\/\/)?[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$/.test(v);        
    },
    domainText: '域名格式必须符合RFC-1035规范',
    domainMask: /[a-zA-Z0-9\-\.\:\/]/i,

	domainExt: function(v) {
        return /^((http\:\/\/)?(\*)?[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$/.test(v);
    },
    domainExtText: '域名格式必须符合RFC-1035规范',
    domainExtMask: /[a-zA-Z0-9\-\.\:\/\*]/i,

    storageTitle: function(v){
    	if(computeStrLength(v) > 100) return false;
    	return true;
    },
    storageTitleText: '不允许超过50个汉字',
    storageTitleMask: /[a-zA-Z0-9\-\.\:\/\*]/i,
    
    billSource: function(v){
    	if(computeStrLength(v) > 200) return false;
    	return true;
    },
    billSourceText: '不允许超过100个汉字',
    billSourceMask: /[a-zA-Z0-9\-\.\:\/\*]/i,
    
    
    goodsBarCode: function(v){
    	if(computeStrLength(v) > 20) return false;
    	return true;
    },
    goodsBarCodeText: '不允许超过20个字符',
    goodsBarCodeMask: /[a-zA-Z0-9]/i,
    
    goodsName: function(v){
    	if(computeStrLength(v) > 50) return false;
    	return true;
    },
    goodsNameText: '不允许超过50个汉字',
    goodsNameMask: /[a-zA-Z0-9\-\.\:\/\*]/i,
    
    info: function(v){
    	if(computeStrLength(v) > 500) return false;
    	return true;
    },
    infoText: '不允许超过250个汉字',
    infoMask: /[a-zA-Z0-9\-\.\:\/\*]/i,
    
    capMax: function(v){
    	if(computeStrLength(v) > 4000) return false;
    	return true;
    },
    capMaxText: '不允许超过4000个字符',
    
  //厅店管理 验证厅店名称
	shopName: function(v){
    	if(computeStrLength(v) > 40) return false;
    	return true;
    },
    shopNameText: '不允许超过20个汉字',
    shopNameMask: /[a-zA-Z0-9\-\.\:\/\*]/i,
	
	//厅店管理 验证省市区
	shopAddress: function(v){
    	if(computeStrLength(v) > 20) return false;
    	return true;
    },
    shopAddressText: '不允许超过10个汉字',
    shopAddressMask: /[a-zA-Z0-9\-\.\:\/\*]/i,
	
	//厅店管理 验证详细地址
	shopDetailAddress: function(v){
    	if(computeStrLength(v) > 200) return false;
    	return true;
    },
    shopDetailAddressText: '不允许超过100个汉字',
    shopDetailAddressMask: /[a-zA-Z0-9\-\.\:\/\*]/i,

    sharingRate: function(v) {
    	var parseResult = parseFloat(v);
    	if(parseResult < 0) return false;
    	if(parseResult >= 100) return false;
    	return isNaN(parseResult)?false:/^-?\d+\.?\d{0,2}$/.test(parseResult);
    },
    sharingRateText: '请输入范围：0-99.99,精确两位小数',
    sharingRateMask: /[\d\.]/i,
    
    productPrice:function(v) {
    	var parseResult = parseFloat(v);
    	if(parseResult < 0) return false;
    	return isNaN(parseResult)?false:/^-?\d+\.?\d{0,2}$/.test(parseResult);
    },
    productPriceText: '请输入正数，可精确到两位小数',
    productPriceMask: /[\d\.]/i
});

function computeStrLength(str) {
	var intLength = 0;
	for(var i=0; i<str.length; i++) {
		if(str.charCodeAt(i)<0||str.charCodeAt(i)>255)
			intLength = intLength + 2;
		else
			intLength = intLength + 1;
	}
	return intLength;
}